package Vue;

import Controler.Controler;
import Model.ChatUser;
import Reseau.ReceiveTCP;
import java.awt.Dimension;
import java.awt.TextArea;
import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import protocol.AckFile;
import protocol.Bye;
import protocol.ChatMessage;
import protocol.FileNotify;


public class ChatGUI2 extends javax.swing.JFrame {

    private Controler control;
    private File file = null;
    private long tailleFichier = 0;

    /** Creates new form ChatGUI */
    public ChatGUI2(Controler p_control) {
        control = p_control;
        control.setChatgui(this);
        initComponents();
        setVisible(true);
        boutonDeconnexion.setEnabled(false);
        boutonEnvoyer.setEnabled(false);
        boutonFichier.setEnabled(false);
    }
    
    public long getTailleFichier() {
        return tailleFichier;
    }
    
    public File getFile(){
        return file;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        boutonConnexion = new javax.swing.JButton();
        boutonDeconnexion = new javax.swing.JButton();
        textFieldNom = new javax.swing.JTextField();
        boutonEnvoyer = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        listUserConnectes = new javax.swing.JList();
        tabbedPaneMessages = new javax.swing.JTabbedPane();
        jScrollPane2 = new javax.swing.JScrollPane();
        textFieldMsgAEcrire = new javax.swing.JTextArea();
        boutonFichier = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Local Chat System");
        setMinimumSize(new java.awt.Dimension(720, 200));
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        boutonConnexion.setText("Connexion");
        boutonConnexion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                boutonConnexionActionPerformed(evt);
            }
        });

        boutonDeconnexion.setText("Déconnexion");
        boutonDeconnexion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                boutonDeconnexionActionPerformed(evt);
            }
        });

        textFieldNom.setText("Entre ton nom...");
        textFieldNom.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                textFieldNomMouseClicked(evt);
            }
        });
        textFieldNom.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                none(evt);
            }
        });

        boutonEnvoyer.setText("Envoyer");
        boutonEnvoyer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                boutonEnvoyerActionPerformed(evt);
            }
        });

        listUserConnectes.setModel(control.getListUsername());
        listUserConnectes.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                listUserConnectesMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(listUserConnectes);

        textFieldMsgAEcrire.setColumns(20);
        textFieldMsgAEcrire.setRows(5);
        jScrollPane2.setViewportView(textFieldMsgAEcrire);

        boutonFichier.setText("Fichier");
        boutonFichier.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                boutonFichierActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(460, 460, 460)
                        .addComponent(boutonFichier, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(boutonEnvoyer)
                        .addGap(12, 12, 12))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 165, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(tabbedPaneMessages)
                            .addComponent(jScrollPane2)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(textFieldNom, javax.swing.GroupLayout.PREFERRED_SIZE, 342, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(boutonConnexion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(boutonDeconnexion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))))
                .addContainerGap(22, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(textFieldNom, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(boutonConnexion))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(boutonDeconnexion)
                        .addGap(16, 16, 16)
                        .addComponent(tabbedPaneMessages, javax.swing.GroupLayout.PREFERRED_SIZE, 182, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(boutonFichier, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(boutonEnvoyer, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void boutonConnexionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_boutonConnexionActionPerformed
        System.out.println("J'ai cliqué sur Connexion");
        try {
            control.setUserLocal(new ChatUser(textFieldNom.getText(), InetAddress.getLocalHost()));
        } catch (UnknownHostException ex) {
            System.out.println("Erreur: impossible de créer un User Local");
        }
        control.connexion();
        //On grise les boutons nécessaires
        boutonConnexion.setEnabled(false);
        boutonDeconnexion.setEnabled(true);
        boutonEnvoyer.setEnabled(false);
        boutonFichier.setEnabled(false);
    }//GEN-LAST:event_boutonConnexionActionPerformed

    private void boutonDeconnexionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_boutonDeconnexionActionPerformed
        System.out.println("J'ai cliqué sur Déconnexion");
        control.deconnexion();
        //On grise les boutons nécessaires
        boutonConnexion.setEnabled(true);
        boutonDeconnexion.setEnabled(false);
        boutonEnvoyer.setEnabled(false);
        boutonFichier.setEnabled(false);
    }//GEN-LAST:event_boutonDeconnexionActionPerformed

    private void none(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_none
        // TODO add your handling code here:
    }//GEN-LAST:event_none

private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
    //On envoie un bye seulement si on ne s'est pas déconnecté au préalable
    if(control.isConnecte()){
        control.deconnexion();
    }
}//GEN-LAST:event_formWindowClosing

private void textFieldNomMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_textFieldNomMouseClicked
    //On efface le login quand on clique sur le jtextfield si on vient d'ouvrir l'appli
    if(textFieldNom.getText().equals("Entre ton nom...")){
        textFieldNom.setText("");
    }
}//GEN-LAST:event_textFieldNomMouseClicked


private void boutonEnvoyerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_boutonEnvoyerActionPerformed
    //On envoie le message écrit dans le textFieldMsgEcrit et on l'ajoute à la conversation
    System.out.println("J'ai cliqué sur envoyer");
    String message = textFieldMsgAEcrire.getText();
    if(!message.isEmpty()){
        //On récupère le ChatUser sur lequel on se trouve
        ChatUser u = recupererUserSelectedOnglet();
        //On crée le chatMessage à envoyer
        ChatMessage cm = new ChatMessage(control.getUserLocal().getUsername(), message, control.getUserLocal().getAdresse());
        control.envoyerMessage(u.getAdresse(), cm);
        mettreAJourOnglet(u.getUsername(), message, true);
    } 
    //On vide la jtextfield pour pouvoir réécrire un message
    textFieldMsgAEcrire.setText("");
}//GEN-LAST:event_boutonEnvoyerActionPerformed

    public ChatUser recupererUserSelectedOnglet(){
        ChatUser u = null;
        //On récupère l'indice de l'onglet sur lequel on est
        int i = tabbedPaneMessages.getSelectedIndex();
        //On récupère le nom de la personne sur l'onglet
        String nom = tabbedPaneMessages.getTitleAt(i);
        for(int j=0; j<control.getListeUser().size(); j++){
            //On récupère le user dans la liste de users correspond au nom de l'onglet
            if(nom.equals(((ChatUser)control.getListeUser().get(j)).getUsername())){
                u = (ChatUser)control.getListeUser().get(j);
            }
        }
        return u;
    }

private void listUserConnectesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listUserConnectesMouseClicked
    //On ajoute un onglet si on a cliqué sur un user de la liste
    System.out.println("J'ai cliqué sur : " + listUserConnectes.getSelectedValue());
    mettreAJourOnglet((String)listUserConnectes.getSelectedValue(), "", false);
}//GEN-LAST:event_listUserConnectesMouseClicked

private void boutonFichierActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_boutonFichierActionPerformed
    System.out.println("J'ai cliqué sur Fichier");
    JFileChooser jfilechooser = new JFileChooser();
    jfilechooser.setVisible(true);
    if (jfilechooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
        file = jfilechooser.getSelectedFile();
        tailleFichier = file.length();
        System.out.println("J'ai sélectionné un fichier: "+ file.getName());
        //On crée un fileNotify à envoyer
        FileNotify filenotify = new FileNotify(control.getUserLocal().getUsername(), control.getUserLocal().getAdresse(), file.getName());
        ChatUser u = recupererUserSelectedOnglet();
        control.envoyerMessage(u.getAdresse(), filenotify);
    }    
}//GEN-LAST:event_boutonFichierActionPerformed

    public void creerFenetreFileNotify(String nomFichier){
        int n = JOptionPane.showConfirmDialog(
            this,
            "Voulez-vous recevoir ce fichier: \n"+nomFichier,
            "Recevoir un fichier",
            JOptionPane.YES_NO_OPTION);
        
        if(n==JOptionPane.YES_OPTION){
            System.out.println("J'ai cliqué sur oui donc j'envoie un ackFile");
            AckFile ackfile = new AckFile(control.getUserLocal().getUsername(), control.getUserLocal().getAdresse(), true);
            ChatUser u = recupererUserSelectedOnglet();
            control.envoyerMessage(u.getAdresse(), ackfile);
            System.out.println("test03");
            control.attendreFichier(u.getAdresse());
        }
        else{
            System.out.println("J'ai cliqué sur non");
            AckFile ackfile = new AckFile(control.getUserLocal().getUsername(), control.getUserLocal().getAdresse(), false);
            ChatUser u = recupererUserSelectedOnglet();
            control.envoyerMessage(u.getAdresse(), ackfile);
        }
            
    }


    //le booléen moi sert pour savoir si on écrit le message recu ou le message envoyé dans l'historique
    public void mettreAJourOnglet(String nom, String message, boolean moi){
        System.out.println("Je veux mettre à jour les onglets");
        
        //On rend les boutons Envoyer et Fichier enable s'ils ne l'étaient pass
        if(!boutonEnvoyer.isEnabled()){
            boutonEnvoyer.setEnabled(true);
        }
        if(!boutonFichier.isEnabled()){
            boutonFichier.setEnabled(true);
        }
       
        boolean trouve=false;
        int i=0;
        String nouveauTexte="";
        String ancienTexte="";
        
        System.out.println("Message à écrire dans l'onglet est: "+message);
        
        //si il y a des onglets
        //alors on recherche si on a déjà crée un onglet pour cette personne
        if(tabbedPaneMessages.getTabCount()!=0){
            System.out.println("Nombre d'onglets: "+tabbedPaneMessages.getTabCount());
            while(trouve!=true && i<tabbedPaneMessages.getTabCount()){
                System.out.println("Titre de l'onglet: "+tabbedPaneMessages.getTitleAt(i));
                if(tabbedPaneMessages.getTitleAt(i).equals(nom)){
                    trouve=true;
                }
                i++;
            }
        }
        System.out.println("Trouve: "+trouve);
        if(trouve==false){
            //On ajoute un textArea (ayant des ascenceurs) à l'onglet si on veut répondre
            System.out.println("J'ajoute un onglet");
            TextArea textArea = new TextArea("");
            //On rend impossible le fait d'écrire dans le jtextarea car cest juste pour l'affichage
            textArea.setEditable(false);
            tabbedPaneMessages.addTab(nom, textArea);
            //On se positionne sur l'onglet créé
            i++;
        }
        else{
            //On récupère l'historique de l'onglet déjà présent
            TextArea textarea = (TextArea)(tabbedPaneMessages.getComponentAt(i-1));
            ancienTexte= textarea.getText();
        }
        
        //On crée le nouveau texte
        if(!message.isEmpty()){// || !message.equals("\n")){
            System.out.println("ca rentre dans la boucle: message: " +message);
            if(moi){
                nouveauTexte="\n"+control.getUserLocal().getUsername()+" a dit: "+message; 
            }
            else{
                nouveauTexte= "\n"+nom+" a dit: "+message;
                System.out.println(nouveauTexte);
            }
        }
        //On ajoute le nouveau texte dans l'historique
        TextArea textarea = (TextArea)(tabbedPaneMessages.getComponentAt(i-1));
        textarea.setText(ancienTexte + nouveauTexte);
    }
    
    public void enleverOnglet(Bye m){
        //Si le personne nous a écrit au moins une fois alors elle apparait dans les onglets donc faut l'enlever
        for(int i=0; i<tabbedPaneMessages.getTabCount(); i++){
            if(tabbedPaneMessages.getTitleAt(i).equals(m.getUsername())){
                tabbedPaneMessages.remove(i);
            }
        }
        //Si il n'y a plus d'onglet alors on grise les boutons Envoyer et Fichier
        if(tabbedPaneMessages.getTabCount()==0){
            boutonEnvoyer.setEnabled(false);
            boutonFichier.setEnabled(false);
        }
    }
    
    public void viderFenetre(){
        tabbedPaneMessages.removeAll();
        textFieldMsgAEcrire.setText("");
    }


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton boutonConnexion;
    private javax.swing.JButton boutonDeconnexion;
    private javax.swing.JButton boutonEnvoyer;
    private javax.swing.JButton boutonFichier;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JList listUserConnectes;
    private javax.swing.JTabbedPane tabbedPaneMessages;
    private javax.swing.JTextArea textFieldMsgAEcrire;
    private javax.swing.JTextField textFieldNom;
    // End of variables declaration//GEN-END:variables
}
